package com.hly.musicbackground.model.music.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hly.musicbackground.Enum.SongEnum;
import com.hly.musicbackground.Enum.UserLogEnum;
import com.hly.musicbackground.Utils.IPUtils;
import com.hly.musicbackground.Utils.StringUtils;
import com.hly.musicbackground.Utils.ThreadPoolUtils;
import com.hly.musicbackground.dao.SongDateilDao;
import com.hly.musicbackground.domain.Song;
import com.hly.musicbackground.domain.SongDateil;
import com.hly.musicbackground.exception.BusinessException;
import com.hly.musicbackground.model.music.params.MusicRidParams;
import com.hly.musicbackground.model.music.service.SongDateilService;
import com.hly.musicbackground.model.music.service.SongService;
import com.hly.musicbackground.model.user.service.UserLogService;
import com.hly.musicbackground.result.Code;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@Log4j2
public class SongDateilServiceImpl extends ServiceImpl<SongDateilDao, SongDateil> implements SongDateilService {

    private final MusicKUWOServiceImpl musicKUWOService;
    private final SongService songService;
    private final UserLogService userLogService;

    private final IPUtils ipUtils;


    @Override
    public String getMp3(int rid) {
        //从数据库中获取歌曲
        SongDateil songDateil = getById(rid);

        //若数据库为空则从网络中爬取，并保存到数据库
        if (songDateil == null){
            songDateil = new SongDateil();
            songDateil.setRid(rid);
            songDateil.setMp3(musicKUWOService.getMp3(String.valueOf(rid)));
            save(songDateil);
        }else if (StringUtils.isEmpty(songDateil.getMp3())){
            // 若数据库不为空，但歌曲链接为空则从网络中爬取歌曲链接，并修改数据库
            songDateil.setMp3(musicKUWOService.getMp3(String.valueOf(rid)));
            updateById(songDateil);
        }

        // 歌曲播放量自增
        songService.playMp3NumAutoincrement(rid);
        userLogService.addUserLogOrFail(rid, UserLogEnum.PLAY_MP3, "");
        return songDateil.getMp3();
    }

    @Override
    public String getMp4(int rid) {

        // 检查该歌曲是否有MV
        if (!songService.isMp4(rid)){
            throw new BusinessException(Code.BUSINESS_ERR, "暂无MV");
        }

        //从数据库中获取MV链接
        SongDateil songDateil = getById(rid);

        //若数据库为空则从网络中爬取，并保存到数据库
        if (songDateil == null){
            songDateil = new SongDateil();
            songDateil.setRid(rid);
            songDateil.setMp4(musicKUWOService.getMp4(String.valueOf(rid)));
            save(songDateil);
        }else if (StringUtils.isEmpty(songDateil.getMp4())){
            // 若数据库不为空，但MV链接为空则从网络中爬取MV链接，并修改数据库
            songDateil.setMp4(musicKUWOService.getMp4(String.valueOf(rid)));
            updateById(songDateil);
        }

        // MV播放量自增
        songService.playMp4NumAutoincrement(rid);
        userLogService.addUserLogOrFail(rid, UserLogEnum.PLAY_MP4, "");
        return songDateil.getMp4();
    }

    @Override
    public String downServer(int rid, String type) {
        SongDateil d = new SongDateil();
        boolean b = type.equals(SongEnum.MP3.getValue());
        if (b){
            String src = musicKUWOService.down(String.valueOf(rid), SongEnum.MP3);
            d.setMp3("http://" + ipUtils.IP + ":" + ipUtils.port + src);
        }else {
            String src = musicKUWOService.down(String.valueOf(rid), SongEnum.MP4);
            d.setMp4("http://" + ipUtils.IP + ":" + ipUtils.port + src);
        }
        d.setRid(rid);

        updateById(d);

        Song song = new Song();
        song.setRid(rid);
        song.setStatus(SongEnum.STATUS_OK.getStatus());
        songService.updateStatus(song);
        return b ? d.getMp3() : d.getMp4();
    }

    @Override
    public void regularTime(MusicRidParams musicRidParams) {
        ThreadPoolUtils.start(() -> {
            while (true){
                try {
                    SongDateil songDateil = getById(musicRidParams.getRid());
                    if (songDateil == null){
                        songDateil = new SongDateil();
                        songDateil.setRid(musicRidParams.getRid());
                        songDateil.setMp3(musicKUWOService.getMp3(String.valueOf(musicRidParams.getRid())));
                        save(songDateil);
                    }else if (StringUtils.isEmpty(songDateil.getMp3())){
                        songDateil.setMp3(musicKUWOService.getMp3(String.valueOf(musicRidParams.getRid())));
                        updateById(songDateil);
                    }
                    log.info("获取了rid为：" + musicRidParams.getRid() + "的歌曲链接");
                }catch (Exception e){
                    log.info("错误rid：" + musicRidParams.getRid());
                }
                finally {
                    musicRidParams.setRid(musicRidParams.getRid() + 1);
                    try {
                        Thread.sleep(30000);
                    }catch (Exception e){}
                }
            }
        });
    }
}
